// 包含n个reducer函数 reduer是真正处理stata的地方，根据原来的state和action返回一个新的state
import { combineReducers } from 'redux'
import {
  AUTH_SUCCESS,
  ERROR_MSG,
  RECEIVE_USER,
  RESET_USER,
  RECEIVE_USER_LIST,
  RECEIVE_MSG_LIST,
  RECEIVE_MSG,
  READ_MSG,
} from './actionTypes'
// 引入计算跳转路径的工具函数
import { getRedirect } from '../utils'

// user:reducer管理user数据状态
let initUser = {data: {reg:false}}  // state初始值
function user (state = initUser, action) {
  switch (action.type) {
    // 授权成功的改变状态
    case AUTH_SUCCESS :
      console.log(action.data)
      // 结构当前的state  和 新的action的数据合并  ,getRedirect对路由跳转进行控制
      let {type, header, code} = action.data
      return {
        ...state,
        
        data: {...action.data,reg:true, redirectTo: getRedirect(code, type, header)},
      }  // 注册成功重定向到 首页
    // 错误信息的改变状态
      break;
    case  ERROR_MSG :
      // var {code} = action.data
      return {...state, data: action.data}
    //  更新用户数据成功的action
    case  RECEIVE_USER :
      // var {type, header, code} = action.data
      return {data: action.data}
    //   更新用户信息失败的action 需要把store中的user重置用户信息 这样可以让用户跳转到 /login
    case RESET_USER :
      return {
        ...initUser,
        data: action.data,
        // redirectTo:
        //   getRedirect(action.data.code
        //   ),
      }
  }
  return state
}

// 定义一个产生userlist 状态的reducer
const initUserList = []
function userList (state = initUserList, action) {
  switch (action.type) {
    case RECEIVE_USER_LIST :
      // 返回一个userlist
      return action.list
    default:
      return state
  }
}

// 顶一个参数chat 聊天状态的reducer
const initChat = {
  users:{},   // 存储的是所有用户的用户名和头像信息
  chatMsg:[],  // 存储的是当前用户相关的聊天消息
  unReadMsgCount:0 // 未读消息总数量
}
 function chat (state= initChat, action) {
    switch (action.type) {
      case RECEIVE_MSG_LIST :
        // 改变聊天消息状态 更新所有聊天消息
        let {userid, chatMsg}  =  action.data
        return {
          ...action.data,
          // 计算出总的未读数量 根据的是： 消息是发给我的吗？并且是未读的  使用数组reduce实现
          unReadMsgCount: chatMsg.reduce((pre,cur) =>  pre + (cur.to === userid && !cur.read ? 1 : 0)   ,0)
        }
      //  更新一条消息
      case RECEIVE_MSG:
        var {userid} = state
        return {
          userid,
          users: state.users,
          // 将新的消息和 原来的消息进行合并
          chatMsg: [...state.chatMsg, action.data], // ...解构
          unReadMsgCount: state.unReadMsgCount + (userid === action.data.to ? 1 : 0)
        }
      //  将消息更新为已读
      case READ_MSG :
        var { chatMsg , users} = state
        var {count, from ,to}  = action.data
        return {
          ...state,
          unReadMsgCount: state.unReadMsgCount - count,
          chatMsg: chatMsg.map(value => {
            if (value.from === from && value.to === to && value.read === false)  {
              return {...value, read: true}
            } else {
              return value
            }
          } )
        }
      default :
        return state
    }
}

// combineReducers将多个reducer函数合并成一个对象交给给store
export default combineReducers({
  // 暴露reducer
  user,  // 结构 : {}对象
  userList,  // 结构： []数组
  chat,  // 聊天的state，  结构{ users:{}, chatMsg:[] ,  unReadMsgCount: Number   }
})
